package com.nexus.core.exception.annotation;

/**
 * 日志等级枚举类，定义不同的日志级别及其优先级
 *
 * @Date 2025/7/25 16:39
 * @Author luzhengning
 **/
public enum ExceptionLevel {

    /**
     * 调试级别：用于开发环境调试，输出详细的调试信息
     * 优先级：最低
     */
    DEBUG(1, "DEBUG"),

    /**
     * 信息级别：用于记录正常的业务流程信息，如操作成功提示
     * 优先级：低于WARN
     */
    INFO(2, "INFO"),

    /**
     * 警告级别：用于记录不影响主要流程的异常情况，需关注但无需立即处理
     * 优先级：低于ERROR
     */
    WARN(3, "WARN"),

    /**
     * 错误级别：用于记录业务逻辑错误，可能影响部分功能，但系统仍可运行
     * 优先级：低于FATAL
     */
    ERROR(4, "ERROR"),

    /**
     * 致命级别：用于记录导致系统崩溃或核心功能失效的严重错误
     * 优先级：最高
     */
    FATAL(5, "FATAL");

    /**
     * 级别权重：数字越大，级别越高，优先级越高
     */
    private final int level;

    /**
     * 级别名称（与常见日志框架保持一致）
     */
    private final String name;

    /**
     * 构造方法：初始化级别权重和名称
     *
     * @param level 级别权重
     * @param name  级别名称
     */
    ExceptionLevel(int level, String name) {
        this.level = level;
        this.name = name;
    }

    /**
     * 根据级别名称获取枚举实例（忽略大小写）
     *
     * @param name 级别名称（如"debug"、"ERROR"）
     * @return 对应的ExceptionLevel实例
     * @throws IllegalArgumentException 当名称不匹配任何级别时抛出
     */
    public static ExceptionLevel fromName(String name) {
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("日志级别名称不能为空");
        }
        for (ExceptionLevel level : values()) {
            if (level.name.equalsIgnoreCase(name)) {
                return level;
            }
        }
        throw new IllegalArgumentException("未知的日志级别：" + name);
    }

    /**
     * 获取级别权重
     */
    public int getLevel() {
        return level;
    }

    /**
     * 获取级别名称
     */
    public String getName() {
        return name;
    }

    /**
     * 判断当前级别是否高于目标级别
     *
     * @param target 目标级别
     * @return true-当前级别更高，false-否则
     */
    public boolean isHigherThan(ExceptionLevel target) {
        return this.level > target.level;
    }

    /**
     * 判断当前级别是否低于目标级别
     *
     * @param target 目标级别
     * @return true-当前级别更低，false-否则
     */
    public boolean isLowerThan(ExceptionLevel target) {
        return this.level < target.level;
    }

    @Override
    public String toString() {
        return name;
    }
}
